﻿#! /usr/bin/python
# -*- coding: utf-8 -*-

import os
from u2palm import *

radiko = ''

cx2eo = {u'cx':u'ĉ', u'Cx':u'Ĉ', u'gx':u'ĝ', u'Gx':u'Ĝ', u'hx':u'ĥ', u'Hx':u'Ĥ',
         u'jx':u'ĵ', u'Jx':u'Ĵ', u'sx':u'ŝ', u'Sx':u'Ŝ', u'ux':u'ŭ', u'Ux':u'Ŭ',
         u'--':u'―', ':(':'', 'vt':'<font color="#AA0000">vt</font>',
         'vn':'<font color="#AA0000">vn</font>',
         '+i':'<font color="#AA0000">+i</font>'}
         
Fakoj = {
u'геогр.'    :u'География',
u'назв.'     :u'Геогр. названия',
u'нац.'      :u'Национальности',
u'личн.'     :u'Личности',
u'имя'       :u'Имена',
u'инф.'      :u'Информатика',
u'радио'     :u'Радиотехника',
u'мат.'      :u'Математика',
u'геом.'     :u'Геометрия',
u'астр.'     :u'Астрономия',
u'физ.'      :u'Физика',
u'яд.физ.'   :u'Ядерная физика',
u'опт.'      :u'Оптика',
u'хим.'      :u'Химия',
u'хим.эл.'   :u'Хим. элементы',
u'ед.изм.'   :u'Единицы измерения',
u'тех.'      :u'Техника',
u'эл.'       :u'Электротехника',
u'трансп.'   :u'Транспорт',
u'авто'      :u'Автомобили',
u'ав.'       :u'Авиация',
u'ж/д'       :u'Жел. дороги',
u'мор.'      :u'Морские слова',
u'с/х'       :u'Сельское х-во',
u'биол.'     :u'Биология',
u'бот.'      :u'Ботаника',
u'зоол.'     :u'Зоология',
u'орн.'      :u'Орнитология',
u'ихт.'      :u'Ихтиология',
u'энт.'      :u'Энтомология',
u'микр.'     :u'Микробиология',
u'анат.'     :u'Анатомия',
u'физиол.'   :u'Физиология',
u'мед.'      :u'Медицина',
u'фарм.'     :u'Фармакология',
u'псих.'     :u'Психология',
u'текс.'     :u'Текстиль',
u'полигр.'   :u'Полиграфия',
u'геол.'     :u'Геология',
u'мин.'      :u'Минералогия',
u'метео'     :u'Метеорология',
u'юр.'       :u'Юриспруденция',
u'пол.'      :u'Политика',
u'филос.'    :u'Философия',
u'иск.'      :u'Искусство',
u'лит.'      :u'Литература',
u'муз.'      :u'Музыка',
u'жив.'      :u'Живопись',
u'театр.'    :u'Театр',
u'кино'      :u'Кино',
u'фото'      :u'Фотография',
u'яз.'       :u'Языковедение',
u'фон.'      :u'Фонетика',
u'грам.'     :u'Грамматика',
u'рел.'      :u'Религия',
u'церк.'     :u'Религия',
u'миф.'      :u'Мифология',
u'сказ.'     :u'Сказочные герои',
u'ист.'      :u'История',
u'воен.'     :u'Военные термины',
u'ден.ед.'   :u'Денежные единицы',
u'эк.'       :u'Экономика',
u'ком.'      :u'Экономика',
u'фин.'      :u'Экономика',
u'кул.'      :u'Кулинария',
u'архит.'    :u'Архитектура',
u'стр.'      :u'Строительство',
u'эсп.'      :u'Эсперанто-движение',
u'г.'      	 :u'Город '
}

VerboString = u"""<idx:infl inflgrp="verbo">
<idx:iform name="preterito" value="%sis"/>
<idx:iform name="prezenco" value="%sas"/>
<idx:iform name="futuro" value="%sos"/>
<idx:iform name="imperativo" value="%su"/>
<idx:iform name="volitivo" value="%sus"/>
</idx:infl>"""

AdjektivoString = """<idx:infl inflgrp="adjektivo">
<idx:iform name="pluralo" value="%sj"/>
<idx:iform name="akuzativo" value="%sn"/>
<idx:iform name="pluralakuzativo" value="%sjn"/>
</idx:infl>"""

PluraloString = """<idx:infl inflgrp="pluralo">
<idx:iform name="akuzativo" value="%sn"/>
</idx:infl>"""

SubstantivoString = """<idx:infl inflgrp="substantivo">
<idx:iform name="elizio" value="%s"/>
<idx:iform name="pluralo" value="%soj"/>
<idx:iform name="akuzativo" value="%son"/>
<idx:iform name="pluralakuzativo" value="%sojn"/>
</idx:infl>"""

gramatiko = {'a':'adjektivo', 'o':'substantivo', 'i':'verbo'}

RusaLetero = u"абвгдеёжзийклмнопрстуфхцчшщьыъэюяАБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЬЫЪЭЯ"

def kreiIndekso(vorto, contents):
	"""
	Создание индексов для Mobipocket.
	На входе получаем строчку полученную из [...]
	Формируемый xHTML код добавляем в массив contents.
	"""
	global radiko
	
	vortoj = vorto.split(', ')
	dt = []
	contents.append('<p>&nbsp;</p><h3 bgcolor="#FFEBD6">&nbsp;')
	for x in vortoj:
		# Обработка ссылки на сетевой словарь (Reta Vortaro)
		if x.find('@') > 0:
			#print x, x.split('@')
			x, revo = x.split('@')
		else: revo = None

		v = x.replace(u' III',u'³').replace(u' II', u'²').replace(u' I', u'¹')
		if len(v) < 1: return None
		if v.find('\~') > 0 and len(radiko) > 1:
		    v = v.replace('\~', radiko[1:] + '/')
		else: v = v.replace('~', radiko + '/')
		
		contents.append("\n<idx:orth ")
		
		# Выделение слов со звёздочкой
		cxuStelo = v[0] == "*"
		if cxuStelo:
			contents.append('style = "bold" ')
			v = v[1:]
			
		r = v.replace(u'³', '').replace(u'²', '').replace(u'¹', '')
		
		# Определяем нескланяемую часть слова для подстановки в слова с тильдой
		i = r.find('|')
		if i > 0: radiko = r[:i]
		elif len(radiko) < 1: radiko = r.replace('-', '')
		
		indekso = r.replace('/','').replace('|','').replace('(', '').replace(')', '').strip()
		dt.append(v.replace(u'/',u'·').replace(u'|',u'·'))
		contents.append('value = "%s">\n' % indekso)

		# Добавляем в индексы варианты склонения слова
		if len(indekso) > 1 and indekso.find('-') < 0:
			rad = indekso[:-1]
			if indekso[-1] == 'i': contents.append(
	                VerboString % (rad, rad, rad, rad, rad))
			elif indekso[-1] == 'o': contents.append(
	                SubstantivoString % (rad, rad, rad, rad))
			elif indekso[-1] == 'a': contents.append( AdjektivoString %
	            	( indekso, indekso, indekso ))
			elif indekso[-1] == 'j': contents.append( PluraloString % rad )
		#elif (indekso[0] == '-') and (indekso[-1] == '-'):
		#	contents.append(u'<idx:key name="Sufikso" key="%s"/>'%indekso[1:-1])
	contents.append('</idx:orth>')
	contents.append(', '.join(dt))
	contents.append("</h3>")
	return None

def kreiArtikon(s):
	"""
	Создание отдельной словарной статьи.
	"""
	global radiko
	radiko = ''

	contents = []
	isList = False
	isKursivo = False
	isDef = False
	
	for line in s.splitlines():
		line = line.strip()
		
		# Если в начале строки # - создаём нумерованный список
		if line[0] == '#':
			line = line[1:]
			if isList: contents.append('</li>\n<li>')
			else:
				isList = True
				contents.append('&nbsp;<ol>\n<li>')
		elif isList and line[0] == '[':
			# При появлении нового слова закрываем открытый список
			contents.append('</li></ol>')
			isList = False
			
		# Если в начале строки ключевое слово, то создаём индекс
		if line[0] == '[':
			i = line.find(']')
			if isDef: contents.append('</p>')
			kreiIndekso(line[1:i], contents)
			line = line[(i+1):]
			# Теперь идёт определение слова
			contents.append('\n<p>')
			isDef = True
		else: contents.append(' ')
		
		if line.find('\~') > 0: line = line.replace('\~', radiko[1:])
		line = line.replace('~', radiko)
		line = line.replace('=>', u"→")
		rusaVorto = []
		isStrike = False
		for c in line:
			if len(rusaVorto) > 0 and (c in '[]_/.,;{}<>='):
				contents.append(u'<idx:key name="Rusa" key="%s"/>' %
					 (''.join(rusaVorto)).strip())
				rusaVorto = []
			if c == "[": contents.append("<b>")
			elif c == ']': contents.append("</b>")
			elif c == '/': contents.append(u'·')
			elif c == '_':
				isKursivo = not isKursivo
				if isKursivo: contents.append("<i>")
				else: contents.append("</i>")
			elif c == '{': contents.append("<small>")
			elif c == '}': contents.append("</small>")
			elif c == '`': isStrike = True
			elif c == '<': None
			elif c == '>': None
			#elif c == '=': contents.append(u"→")
			else:
				contents.append(c)
				if isStrike:
					contents.append(u"́")
					isStrike = False
				if not isKursivo:
					if (c in RusaLetero) or (c == ' ' and len(rusaVorto) > 0):
						rusaVorto.append(c)

	# Если был открыт и не закрыт список - закрываем его
	if isList:	contents.append('</li></ol>')
	# Закрываем определение последнего слова
	contents.append('</p>')
	artiko = '<mbp:pagebreak/><idx:entry name="vortaro">%s</idx:entry>'
	return artiko % ''.join(contents)

def kreiDosieron(nomo):
	"""
	Создание на основе исходного текстового файла из каталога ../src
	файла в формате XHTML для Mobipocket Reader. Получаемый файл сохраняется
	в каталоге ../mobi/xhtml
	"""
	print "Faras dosieron: ", nomo
	out = [u"""<html><head>
	<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
	<title>Esperanta-rusa vortaro</title></head><body>"""]
	data = open('../src/%s.txt'%nomo,'r').read().decode('cp1251').split("\n\n")
	for i in data:  out.append(unicode(kreiArtikon(i)))
	out.append(u'</body></html>')
	s = ''.join(out)
	for c in cx2eo: s = s.replace(c, cx2eo[c])
	
	# Создаём индексы для разделов
	for fako in Fakoj:	s = s.replace(u'<i>%s</i>' % fako,
		u'<idx:key name="Fako" key="%s"/><span title="%s"><i>%s</i></span>'
		 % (Fakoj[fako], Fakoj[fako], fako))
		 
	# ЗАписываем файл в формате xHTML
	open('../mobi/xhtml/%s.html'%nomo,'w').write(s.encode('utf8'))
	return None

def main():
	for fileName in os.listdir ( '../src' ):
		if fileName[0] == '.' : continue
		if fileName[-4:] == '.txt' : kreiDosieron(fileName[:-4])
	unicode2palm('../mobi/', '../palm/')
	unicode2palm('../mobi/xhtml/', '../palm/xhtml/')
	return None
main()
